/*
 * Copyright (C) 2015 yixun All Rights Reserved.
 * 
 * CustomerPremisesService.java
 */
package com.yixun.qfbao.xf.service;

import com.yixun.common.page.Page;
import com.yixun.qfbao.model.*;
import com.yixun.qfbao.model.initdto.InitCPCustomerDto;
import com.yixun.qfbao.model.whdto.ItemInfoDto;
import com.yixun.qfbao.util.exception.TServerException;
import com.yixun.qfbao.xf.model.CustomerPremises;
import com.yixun.qfbao.xf.model.Premises;
import com.yixun.qfbao.xf.model.dto.CustomerPremisesDto;
import com.yixun.qfbao.xf.model.dto.CustomerPremisesVisitCountDto;
import com.yixun.qfbao.xf.model.dto.SendIntentionListResultDto;
import com.yixun.qfbao.xf.model.dto.SendVisitListResultDto;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Future;

/**
 * [文件名称]<br>
 * CustomerPremisesService.java<br>
 * <br>
 * [文件描述]<br>
 * 客户报备信息 service interface<br>
 * <br>
 * [修改记录]<br>
 * 2015-10-14 15:34:13 创建 陶俊代码生成器<br>
 * 
 * @author 陶俊代码生成器
 * @version 1.00
 */
public interface CustomerPremisesService {
	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<CustomerPremises> getPageModel(CustomerPremisesDto entity, int begin, int end);
	/**
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<CustomerPremisesDto> getMyPageModel(CustomerPremisesDto entity, int begin, int end);/**
	 * @param entity
	 *            搜索条件 特殊需求（不对premises表中的del_falg做限制）
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<CustomerPremisesDto> getMyPageModel2(CustomerPremisesDto entity, int begin, int end);

	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremises> selectListByDto(CustomerPremisesDto entity);

	/**
	 * 查询单个
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public CustomerPremises selectByDto(CustomerPremisesDto entity);

	/**
	 * @param id
	 *            根据主键搜索
	 * @return 一行记录
	 */
	public CustomerPremises selectById(Long id);

	/**
	 * @param mobile
	 *            验证手机号码唯一（前三后四）
	 * @return 一行记录
	 */

	public CustomerPremises selectByMobile(String mobile);
	/**
	 * @param id
	 *            根据主键搜索
	 * @return 一行记录
	 */
	public CustomerPremisesDto selectByMyId(Long id);

	/**
	 * @param entity
	 *            根据pojo搜索如果主键为空则返回它本身
	 * @return 一行记录或本身
	 */
	public CustomerPremises selectBy(CustomerPremises entity);

	/**
	 * @param entity
	 *            新增记录的详细信息
	 * @return 新增行数
	 */
	public CustomerPremisesDto create(CustomerPremisesDto entity);

	/**
	 * @param entity
	 *            更新记录的详细信息
	 * @return 更新行数
	 */
	public int update(CustomerPremisesDto entity);

	/**
	 * 紧急处理更新操作
	 * @param entity
	 * @return
	 */
	int newUpdate(CustomerPremisesDto entity);

	/**
	 * @param entity
	 *            更新状态
	 * @return 更新行数
	 */
	public int updateStatus(CustomerPremisesDto entity);

	int updateCustomerByCustomerIds(CustomerPremisesDto entity);

	int edits(CustomerPremises customerPremises, String ids);

	/**
	 * @param entity
	 *            待删除的记录信息
	 * @return 删除行数
	 */
	public int destroy(CustomerPremisesDto entity);

	/**
	 * @param entity
	 *            新增或更新
	 * @return 新增行数
	 */
	public int saveOrUpdate(CustomerPremisesDto entity);

	/**
	 * 方法描述 : 重新报备 创建者：ThinkPad 项目名称： channel-basic 类名： CustomerPremisesService.java 版本： v1.0 创建时间： 2017年1月11日 下午2:36:53
	 * 
	 * @param cusPremisesId
	 * @param staffId
	 * @return String
	 */
	public String reSubmit(String accountType, Long cusPremisesId, Long staffId, String remark);
	
	/**
	 * 方法描述 : 重新报备 创建者：ThinkPad 项目名称： channel-basic 类名： CustomerPremisesService.java 版本： v1.0 创建时间： 2017年1月11日 下午2:36:53
	 * 
	 * @param cusPremisesId
	 * @param staffId
	 * @return String
	 */
	public String toReport(Long cusPremisesId, Long staffId, String remark);

	/**
	 * 查询报备人的佣金信息 功能描述: <br>
	 * 〈功能详细描述〉
	 * 
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public CustomerPremisesDto selectCustomerPremisesByStaffId(PartnerInfo partner, Boolean isturn, String commisionFlag);

	/**
	 * 查询报备人的佣金信息列表 功能描述: <br>
	 * 〈功能详细描述〉
	 * 
	 * @param entity
	 * @return
	 * @see [相关类/方法](可选)
	 * @since [产品/模块版本](可选)
	 */
	public Page<CustomerPremisesDto> selectCustomerPremisesListByStaffId(CustomerPremisesDto entity, Integer pageNo,
			Integer pageSize, String loginType);
	
	public int count(CustomerPremisesDto entity);

	int overTradeTimeCount(CustomerPremisesDto entity);
	
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremises> findCustomerListByStaffId(CustomerPremisesDto entity);
	
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremisesDto> selectRecommendCusByPremises(CustomerPremisesDto entity);
	
	public List<CustomerPremisesDto> selectAdminRecommendCusByPremises(CustomerPremisesDto entity);
	
	//经纪人排行查询
	public Page<AgentRankReport> queryAgentRankReport(AgentRankReportParam agentRankReportParam,int begin,int end);
	//客户推荐转化
	public Page<CustomerConversionReport> queryCustomerConversionReport(CustomerConversionReportParam customerConversionReportParam,int begin,int end);
	
	//渠道效果分析
	public List<ChannelEffectReport> queryChannelEffectReport(ChannelEffectReportParam channelEffectReportParam);
	//渠道效果分析
	public Page<ChannelEffectReport> queryAllChannelEffectReport(ChannelEffectReportParam channelEffectReportParam,int begin,int end);
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremisesDto> selectCustomerByPremises(CustomerPremisesDto entity);

	/**
	 * 待处理申诉记录
	 * @param entity
	 *            搜索条件
	 * @param begin
	 *            分页开始行数[不包含]
	 * @param end
	 *            分页结束行数[包含]
	 * @return 分页记录
	 */
	public Page<CustomerPremisesDto> getAppealPageModel(CustomerPremisesDto entity, int begin, int end);
	
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremisesDto> selectCommissionByPremises(CustomerPremisesDto entity);
	
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremisesDto> selectCustomerByDay(CustomerPremisesDto entity);
	
	/**
	 * 计算楼盘下次带看保护时间
	 * @param premisesId
	 * @return
	 */
	public Calendar getVisitProtectCalendar(Long premisesId, String visitProtect);

    /**
     * 计算楼盘下次交易保护时间
     * @param premisesId
     * @return
     */
	public Calendar getSaveDaysCalendar(Long premisesId, String saveDays);
	
	/**
	 * 报备超过预期带看时间未到访
	 * 提醒经纪人
	 */
	public int hopeVisitOverTime();
	/**
	 * 当期望带看时间>报备保护时间,超过报备保护时间,报备设为无效
	 * 当期望带看时间<报备保护时间,超过期望带看时间,报备设为无效
	 */
	public int overReportedTime();
	
	/**
	 * 查询列表
	 * 
	 * @param entity
	 *            搜索条件
	 * @return 分页记录
	 */
	public List<CustomerPremises> selectListByIds(CustomerPremisesDto entity);
	/**
	 * 根据ID修改转客状态为已转客
	 * @param entity
	 * @return
	 */
	public int updateByIds(CustomerPremisesDto entity);
	/**
	 * 客户到访后、认筹、认购、签约,判断生效日期是否大于流程等待时间,大于的,将报备设为无效
	 * 
	 */
	public int flowConfirm();
	/**
	 * 获取对接人信息
	 * @param staffId 经纪人id
	 * @return
	 */
	public Long getPricipalId(Long staffId);
	/**
	 * 获取报备当前状态和业务状态
	 * @param customerPremises
	 * @return
	 */
	public Map<String,String>getCusStatus(CustomerPremises customerPremises);
	/**
	 * 
	* @Title: CustomerPremisesService
	* @Description: 分销佣金机构列表数据 
	* @author guifang.weng  
	 * @throws ParseException 
	* @date 2017年10月24日 下午2:09:37
	 */
	public Page<CustomerPremisesDto> selectDisCompanyListData(
			PartnerInfo partnerInfo, Integer integer, Integer integer2) throws TServerException, ParseException;
	/**
	 * 获取机构佣金详情
	 *@author xiaojin.li
	 *@date 2017年10月24日下午1:17:42
	 *@param customerPremisesDto
	 *@return
	 */
	public List<CustomerPremisesDto> getSettlementRecord(CustomerPremisesDto customerPremisesDto);
	/**
	 * 获取汇总数据
	 *@author xiaojin.li
	 *@date 2017年10月25日下午2:14:32
	 *@param customerPremisesDto
	 *@return
	 */
	public CustomerPremisesDto getCommissionDetail(CustomerPremisesDto customerPremisesDto);
	/**
	 * 机构佣金明细表
	 *@author xiaojin.li
	 *@date 2017年10月25日下午4:02:37
	 *@param customerPremisesDto
	 *@return
	 */
	public List<CustomerPremisesDto> getCooCommissionDetail(CustomerPremisesDto customerPremisesDto) throws ParseException;

	/**
	 * 查询成交总金额
	 * @param customerPremisesDto
	 * @return int
	 * @author shaoping.jiao
	 */
	public BigDecimal queryDealTotalAmount(@Param("customerPremisesDto")CustomerPremisesDto customerPremisesDto);
	
	/**
	 * 查询成交总套数
	 * @param customerPremisesDto
	 * @return int
	 * @author shaoping.jiao
	 */
	public int queryDealTotalNumber(@Param("customerPremisesDto")CustomerPremisesDto customerPremisesDto);
	/**
	 * 查询机构佣金详情交易
	 *@author xiaojin.li
	 *@date 2017年10月27日下午5:25:29
	 *@param commissionId
	 *@param begin
	 *@param end
	 *@return
	 */
	public Page<CustomerPremisesDto> getCommissionPageModel(Long commissionId,Integer begin,Integer end) throws ParseException;

	/**
	 * 查询报备
	 * @param id
	 * @return
	 */
	CustomerPremises selectByIdForLock(Long id);

	/**
	 * 校验手机号是否可以报备
	 * @param mobile
	 * @param premises
	 * @return
	 */
	public boolean checkReportMobile(String mobile, Premises premises, boolean repeatFlag);

	/**
	 * 校验手机号到访重复
	 * 此校验与是否开启重复报备开关无关
	 * @param cusPreId
	 * @return
	 */
	boolean checkVisitRepeat(Long cusPreId, Premises premises, String mobile);

    /**
     * 到访延长时间限制定时任务实现层
     * @return
     */
    int setOverVisitTimeForJob();


	List<CustomerPremisesDto> selectCPForVisitJob();

    /**
     * 查询有效报备数
     * @param customerPremisesDto
     * @return
     */
	Future<String> querySignCount(CustomerPremisesDto customerPremisesDto);

    /**
     * 查询有效到访数
     * @param customerPremisesDto
     * @return
     */
	Future<String> querySignAmountCount(CustomerPremisesDto customerPremisesDto);

    /**
     * 查询有效报备数
     * @param customerPremisesDto
     * @return
     */
    Future<String> queryValidReportCount(CustomerPremisesDto customerPremisesDto);

    /**
     * 查询有效到访数
     * @param customerPremisesDto
     * @return
     */
    Future<String> queryValidVisitCount(CustomerPremisesDto customerPremisesDto);

    /**
     * 认筹数
     * @param customerPremisesDto
     * @return
     */
    Future<String> queryPayDepositCountCount(CustomerPremisesDto customerPremisesDto);

    /**
     * 认购数
     * @param customerPremisesDto
     * @return
     */
    Future<String> querySubscribeTotalCount(CustomerPremisesDto customerPremisesDto);

    /**
     * 通过报备ID获取公司信息
     * @param id
     * @return
     */
    CustomerPremisesDto selectCompanyByCpId(Long id);
    /**
     * 校验手机号是否存在报备保护期内的数据
     * @param mobile
     * @param premises
     * @return
     */
    boolean checkReportProtect(String mobile, Premises premises);

	/**
	 * 获取最新的一次重置节点
	 * @param customerPremisesDto
	 * @return
	 */
	CustomerPremises selectResetNode( CustomerPremisesDto customerPremisesDto);

	/**
	 *
	 * @param hopeVisitTime
	 * @param premises
	 * @return
	 */
	boolean checkSpecialTime(Long hopeVisitTime,Premises premises);


	List<CustomerPremises> selectMyListByDto(CustomerPremisesDto customerPremisesDto,int beginNum,int endNum);

	List<CustomerPremisesVisitCountDto> visitCount(List<Long> customerPremisesIds);

	int changeCPAdviser(Long premisesId, Long customerPremisesId, String originalAdviser, String newAdviser);

	/**
	 * 获取即将无效的提醒消息
	 * @return
	 */
	List<Map<String, Object>> getToBeDueRemainderInfo(int begin, int limit, Date date);
	
	/**
	 * 获取已经无效的提醒消息
	 * @return
	 */
	List<Map<String, Object>> getDueRemainderInfo(int begin, int limit, Date date);
	
	/**
	 * 根据ID和remainderType，add状态变更提醒次数
	 * @param dueRemainderInfos
	 * @return
	 */
	int addSendTimesById(List<Map<String, Object>> dueRemainderInfos);
	
	int resetConfirm(CustomerPremisesDto customerPremisesDto);

	Page<CustomerPremisesDto> getCpPageModel(CustomerPremisesDto entity, int begin, int end);

	List<ItemInfoDto> selectWHSyncReportList(CustomerPremisesDto customerPremisesDto);

	List<InitCPCustomerDto> selectInitCPCustomerList(CustomerPremisesDto customerPremisesDto);

	List<CustomerPremisesDto> selectImportRepeatListByDto(CustomerPremisesDto customerPremisesDto);

	/**
	 * 定时推送 到访数据查询
	 * @param lastTime
	 * @param companyId
	 * @return
	 */
	List<SendVisitListResultDto> getSendVisitList(String lastTime, Long companyId);

	/**
	 * 定时推送 报备信息查询
	 * @param lastTime
	 * @param companyId
	 * @return
	 */
	List<SendIntentionListResultDto> getSendIntentionList(String lastTime, Long companyId);

}
